// 导入express模块
const express = require('express');


// 创建express服务器
const app = express();

// 配置解析application/x-www-form-urlencoded表单数据的中间件   一定要放在配置路由的前边
app.use(express.urlencoded({ extended: false }))

// 导入错误级别中间件
const joi = require('joi')



//  封装res.cc函数
// 响应数据的中间件
app.use((req,res,next)=>{
    // status = 0 为成功； status = 1 为失败； 默认将 status 的值设置为 1，方便处理失败的情况
    res.cc = function(err,status = 1){
        res.send({
            // 状态
            status,
            // 状态描述 判断err 是错误对象 还是 字符串
            message: err instanceof Error ? err.message : err
        })
    }
    next()
})




// 导入并配置cors中间件
const cors = require('cors');
// 注册成全局中间件
app.use(cors())


// 配置文件
const config = require('./config')
// 解析token中间件
const expressJWT = require('express-jwt')
// 使用.unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行token的身份验证
app.use(expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/api\//] }))

// 托管静态资源文件
app.use('/uploads', express.static('./uploads'))


// 导入用户路由模块
const userRouter = require('./router/user')
app.use('/api', userRouter)

// 导入并使用用户信息路由模块
const userinfoRouter = require('./router/userinfo')
// 注意：以/my开头的接口 都是由权限的接口 需要进行Token身份认证
app.use('/my',userinfoRouter)

// 导入并使用文章分类路由模块
const artCateRouter = require('./router/artcate')
// 为文章分类的路由挂载统一的访问前缀
app.use('/my/article', artCateRouter)

// 导入并使用文章路由模块
const articleRouter = require('./router/article')
// 为文章的路由挂载统一的访问前缀 /my/article
app.use('/my/article', articleRouter)


// 错误中间件
app.use(function (err, req, res, next) {
    // 数据验证失败
    if (err instanceof joi.ValidationError) return res.cc(err)

    //捕获身份认证失败的错误
    if (err.name === 'UnauthorizedError') return res.cc('身份认证失败')
    // 未知错误
    res.cc(err)
})




// 启动服务器
app.listen(3007, function () {
    console.log('server is running on port http://127.0.0.1:3007');
});